package com.hspedu;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

public class reflectionTest {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchFieldException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("D:\\javaproject\\project1\\chapter17_reflect\\src\\re.properties"));
        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();

        Class clazz=Class.forName(classfullpath);
        Object o = clazz.newInstance();
        Method method=clazz.getMethod(methodName);
        method.invoke(o);//传统方法 对象.方法() , 反射机制 方法.invoke(对象)

        //getField 不能得到私有的属性
        Field nameField = clazz.getField("name"); //
        System.out.println(nameField.get(o)); // 传统写法 对象.成员变量 , 反射 : 成员变量对象.get(对象)
//java.lang.reflect.Constructor: 代表类的构造方法, Constructor 对象表示构造器
        Constructor constructor = clazz.getConstructor(); //()中可以指定构造器参数类型, 返回无参构造器
        System.out.println(constructor);//Cat()
        Constructor constructor2 = clazz.getConstructor(String.class);
        //这里老师传入的 String.class 就是 String 类的Class 对象
        System.out.println(constructor2);//Cat(String name)

    }
}
